https://introtcs.org/public/lec_02_representation.html#cantorsec
์นธํ ์ด ์ ๋ฆฌ
์์ ์์
๋ด์ฉ ์ ๋ฆฌ๋ฅผ ๋ณด๋ฉด 0๊ณผ1์ ์กฐํฉ์ ๋ฌดํํ์ง๋ง, ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ชจ๋ ๊ฑธ ๋ค 0๊ณผ1๋ก ํํํ ์ ์๋ค๊ณ ํ๋ค. (์์ ์์์์๋ ๋ดค๋ฏ 12.3์ 0๊ณผ1๋ง์ผ๋ก ํํํด๋ด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์)
๊ทธ๋ฌ๋ฉด์ ๊ต์ฌ๋ ์นธํ ์ด์ ์งํฉ๋ก ์ ์๊ฐํ๋๋ฐ, ์ฒ ํ์์
๋ ์ข
์ข
๋ค์ด๋ด์ ์ต์ํ ์ด๋ฆ์ด์๋ค.
Countable sets ๊ฐ์ฐ์งํฉ
์ด๋ค ์งํฉ S๊ฐ ๊ฐ์ฐ์งํฉ์ด๋๊ฑด ๋ฌด์จ ์๋ฏธ๋๋ฉด, ์ฌ๊ธฐ์ ๋์ํ๋ onto map C๊ฐ ์๋ค๋ ๊ฒ์ด๋ค. ์ด๋ค ์งํฉ A์์ C๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด S์ ๋ชจ๋ ์์๋ค์ด A์ ์์๋ค๊ณผ ๋งตํ์ด ๋๋ค๋ฉด ๊ฐ์ฐ ์งํฉ์ด๋ผ๋ ๋ป.
์์ฐ์๊ฐ ๋ํ์ ์ธ ๊ฐ์ฐ ์งํฉ๋๋ค. 0๊ณผ1์ ์กฐํฉํด์ ๋ชจ๋ ์ซ์๋ฅผ ๋ํ๋ผ ์ ์์ผ๋๊น. ์ฆ ์์์ ๋ณธ NtS ํจ์๊ฐ ์์ผ๋๊น.
๊ทธ๋ฐ๋ฐ ์ค์๋ฅผ ์ด์ง์๋ก ํํํ๋ ๋ฐฉ๋ฒ์์ ๋ณธ๊ฒ์ฒ๋ผ ์ด๋ค ์ค์๋ 0๊ณผ 1๋ง์ผ๋ก ํํํ ์ ์๋ค. ๊ทธ๋์ ์ค์๋ค์ ์งํฉ์ ๋ถ๊ฐ์ฐ ์งํฉ. ๊ทธ๋ฆฌ๊ณ ๋ถ๊ฐ์ฐ ์งํฉ์ ๊ฐ์ฐ ์งํฉ๋ณด๋ค ํฌ๋ค.
def diagonalize(f,n):
"""Input: function f mapping integers to sequences of 0 and 1. A number n
Output: a sequence L of length n that is not in the image of f on {0....n-1}
"""
return [1-f(k)[k] for k in range(n)]
#%%
# Example:
def f(k): # some way to map integers to lists of length 100
return [(k * i) % 2 for i in range(100)]
D = diagonalize(f,100)
print(D)
#%%
found = False
for k in range(100):
if D == f(k):
print("D is in f's image")
found = True
break
if not found: print("D is not in f's image")
diagonalize()๋ 0๋ถํฐ n๊น์ง
f(k)ํจ์๋ฅผ ์คํํด์ 1์์ ๊ทธ๊ฒ์ ๋บ ๊ฐ๋ค์ ๋ฐํํ๋ค.
f(k)์ด ํธ์ถ๋๋ฉด
0๋ถํฐ 100๊น์ง ๋ฐ๋ณตํ๋ฉด์ k์ ๊ณฑํด์ ๋์จ ์๋ฅผ mod 2 ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
f(0)์ k๊ฐ 0์ด๋ ๋ชจ๋ ์ซ์๊ฐ ๋ค 0.
f(0)[0]์ 0, 1-1=1.
f(1)์ 1,2,3,4,5, ..., 100๋ค์ ๋ค %2 ํ๋ฉด 1,0,1,0,...0์ด ๋๋ค.
f(1)[1]์ 1, 1-1=0.
f(2)๋ 2,4,6,8, ...., 200 ์ด๊ณ ๋ค %2 ํด๋ณด๋ฉด 0,0, ...., 0.
f(2)[2]๋ 0, 1-0=1.
๊ทธ๋ ๊ฒ D์๋ [1,0,1, .....] ์ด ๋ด๊ธด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฒ์ฆ๋จ๊ณ k=0 ๋ถํฐ 100๊น์ง
f(0)์ [0,0,0, .... , 0] != D.
f(1)์ [1,0,1,0,....., 0] != D.
๊ทธ๋ฌ๋๊น f๊ฐ 100๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก 0~100์ ์์ฐ์๋ฅผ 0๊ณผ1๋ก ํํํ๊ฑฐ๋ผ๋ฉด
D๋ ๊ฐf(k)[k]์ ์๋ฆฌ ์ซ์์ ๋ฐ๋๋๋ ์ซ์๋ฅผ ๊ฐ์ง๋, ๊ธฐ์กด์ ์๋ ์๋ก์ด ํํ์ด๋ค.